from random import randint

from django.http import HttpResponse, JsonResponse
from django.shortcuts import render

# Create your views here.
from django.views import View
from django_redis import get_redis_connection

from celery_tasks.sms.tasks import celery_send_sms_code
from utils.captcha.captcha import captcha
from utils.sms.sms_util import SmsUtil


class ImageCodeView(View):
    def get(self, request, uuid):
        # 接口函数生成验证码的内容和图片
        code, image = captcha.generate_captcha()
        # 连接settings.py文件内设置的redis数据库
        redis_cli = get_redis_connection('code')
        # 把验证码存入redis  uuid为前端发送过来的当作key  120s为过期时间 code为验证码
        redis_cli.setex(uuid, 120, code)
        # 返回图片验证码给前端
        return HttpResponse(image, content_type='image/jpeg')


class SmsCodeView(View):
    def get(self, request, mobile):
        # 获取前端传过来的数据  用户输入的图片验证码和对应的uuid
        get_dict = request.GET
        image_code = get_dict.get('image_code')
        uuid = get_dict.get('image_code_id')
        # 如果缺少参数就返回
        if not all([image_code, uuid]):
            return JsonResponse({'code': 400, 'errmsg': '参数不全'})

        # 连接redis
        redis_cli = get_redis_connection('code')
        # 根据uuid获取到正确的图片验证码
        redis_image_code = redis_cli.get(uuid)
        # 如果redis数据库不存在就说明过期了
        if not redis_image_code:
            return JsonResponse({'code': 400, 'errmsg': '验证码过期,请刷新'})
        # 如果取出来了就删除redis中的图片验证码，节省内存
        try:
            redis_cli.delete(uuid)
        except Exception as e:
            print("删除图片验证码")
        # 与用户输入的图片验证码对比
        if image_code.lower() != redis_image_code.decode().lower():
            return JsonResponse({'code': 400, 'errmsg': '验证码不正确'})

        # 存到redis一个变量180秒如果存在就返回操作过于频繁， 避免频繁发送验证码
        send_flag = redis_cli.get('send_flag_%s' % mobile)
        if send_flag:
            return JsonResponse({'code': 400, 'errmsg': '操作过于频繁'})
        # 创建redis管道， 节省时间
        pl = redis_cli.pipeline()
        # 获取一个6位数短信验证码
        sms_code = '%06d' % randint(0, 999999)

        # 存入验证频繁的变量和短信验证码到redis数据库
        pl.setex('send_flag_%s' % mobile, 180, 1)
        pl.setex('sms_%s' % mobile, 180, sms_code)
        # 执行操作
        pl.execute()
        # 发送短信到用户手机，三分钟有效期
        # SmsUtil().send_message('1', mobile, (sms_code, '3'))
        celery_send_sms_code.delay('1', mobile, sms_code)
        # 返回成功
        return JsonResponse({'code': 0, 'errmsg': 'ok'})
